




/**
 * @author 孙宇
 *
 * @requires jQuery,EasyUI
 *
 * panel关闭时回收内存，主要用于layout使用iframe嵌入网页时的内存泄漏问题
 */
$.fn.panel.defaults.onBeforeDestroy = function() {
    var frame = $('iframe', this);
    try {
        if (frame.length > 0) {
            for ( var i = 0; i < frame.length; i++) {
                frame[i].contentWindow.document.write('');
                frame[i].contentWindow.close();
            }
            frame.remove();
            if ($.browser.msie) {
                CollectGarbage();
            }
        }
    } catch (e) {
    }
};



/**
 * 设置验证信息
 * @param json
 * true:有错误信息
 * false:没有错误信息
 */
$.fn.showMessage = function(json){

    if(json.validateerrors!=null && json.validateerrors!=undefined){//有验证错误信息

        var parent=this;
        parent.hideMessage();

        $.each(json.validateerrors,function(i,v){

               $('#'+v.field,parent).addClass("myvalidatebox-invalid");
               $('#'+v.field,parent).attr('title', v.message);
               $('#'+v.field,parent).tooltip({});


        });
        return true;
    }else if(json.body_validateerrors!=null && json.body_validateerrors!=undefined){//有验证错误信息

//        var parent=this;
//        parent.hideMessage();
//
//        $.each(json.validateerrors,function(i,v){
//            if(i!='body_validateerrors'){
//
//                $('#'+v.field,parent).addClass("myvalidatebox-invalid");
//                $('#'+v.field,parent).attr('title', v.message);
//                $('#'+v.field,parent).tooltip({});
//            }
//
//        });
        return true;
    }else if(json.remoteErrors!=null && json.remoteErrors!=undefined){//有错误信息
        //$('div #remoteErrors',this).html(json.remoteErrors);
        $.messager.alert('错误',json.remoteErrors);
        return true;
    }else if(json.remoteMessage!=null && json.remoteMessage!=undefined){

        $.messager.show({
            title:'消息',
            msg:json.remoteMessage
        });
        return false;
    }else{
        return false;
    }

}

$.fn.hideMessage = function(){

    var parent=this;

    var items=$('[title]',parent);

    for(var i=0;i< items.length;i++){

        $(items[i]).removeAttr('title');
       $(items[i]).removeClass("myvalidatebox-invalid");

        $(items[i]).tooltip('destroy');


    }




}

/**
 * 将Form 转化成 json 对象
 * @return {{}}
 */
$.fn.serializeObject = function() {
    var o = {};
    var a = this.serializeArray();
    var form=this;
    //alert(a.length);
    for(var i=0;i< a.length;i++){
        // alert(a[i].name);
        //判断字段是否为date类型，自动转换为UTC时间
        var formitem= $('#'+a[i].name,form);
//        alert(a[i].name+':'+$(formitem).attr('canSave'));
        if($(formitem).attr('canSave')=='false'){

            continue;
        }

        if(a[i].value){
            if($(formitem).attr('date')!=undefined){
                var  utctime=Date.parse(a[i].value);

                 a[i].value=utctime.toString();


            }else  if($(formitem).attr('datetime')!=undefined){
                var  utctime=Date.parse(a[i].value);
                a[i].value=utctime;

            }
        }


        if(a[i].name.indexOf('.')!=-1){
            if(a[i].value==''){
                o[a[i].name.split('.')[0]]='';
                continue;
            }
        }




        if (o[a[i].name]) {
            if (!o[a[i].name].push) {
                o[a[i].name] = [ o[a[i].name] ];
            }
            o[a[i].name].push(a[i].value || '');
        } else {

            o[a[i].name] = a[i].value || '';
        }
    }

    return o;
}

/**
 * @author 孙宇
 *
 * @requires jQuery,EasyUI
 *
 * 防止panel/window/dialog组件超出浏览器边界
 * @param left
 * @param top
 */
var easyuiPanelOnMove = function(left, top) {
    var l = left;
    var t = top;
    if (l < 1) {
        l = 1;
    }
    if (t < 1) {
        t = 1;
    }
    var width = parseInt($(this).parent().css('width')) + 14;
    var height = parseInt($(this).parent().css('height')) + 14;
    var right = l + width;
    var buttom = t + height;
    var browserWidth = $(window).width();
    var browserHeight = $(window).height();
    if (right > browserWidth) {
        l = browserWidth - width;
    }
    if (buttom > browserHeight) {
        t = browserHeight - height;
    }
    $(this).parent().css({/* 修正面板位置 */
        left : l,
        top : t
    });
};
$.fn.dialog.defaults.onMove = easyuiPanelOnMove;
$.fn.window.defaults.onMove = easyuiPanelOnMove;
$.fn.panel.defaults.onMove = easyuiPanelOnMove;


/**

 *
 * 改变jQuery的AJAX默认属性和方法
 */
$.ajaxSetup({

    type : 'POST',
    error : function(XMLHttpRequest, textStatus, errorThrown) {
        $.messager.progress('close');
    //        alert(errorThrown);
    //        alert(textStatus);
    //        alert(JSON.stringify(XMLHttpRequest));
        if(XMLHttpRequest.status==401){
            openLock();
        }else
            $.messager.alert('错误', XMLHttpRequest.responseText);
        $('#loadMsg').html('');
    },
    beforeSend:function (XMLHttpRequest) {
//        $.messager.progress('close');
//        $.messager.progress({text:'数据加载中,请稍等......'});
        $('#loadMsg').html('正在加载数据，请稍等......');
       // alert(XMLHttpRequest.status);
    },success:function (data, textStatus) {
        // data 可能是 xmlDoc, jsonObj, html, text, 等等...
        //this; // 调用本次AJAX请求时传递的options参数
//        $.messager.progress('close');
        $('#loadMsg').html('');
       // alert(XMLHttpRequest.status);
    },complete:function (XMLHttpRequest, textStatus) {
       // this; // 调用本次AJAX请求时传递的options参数
//           $.messager.progress('close');
        $('#loadMsg').html('');

        if(XMLHttpRequest.status==401){
            openLock();
        }
    }
});




//$.ajaxStart(function(){
//    $.messager.progress();
//});
//
//$.ajaxSend(function(evt, request, settings){
//    alert(request.responseText);
//});

/**
 * 密码验证
 */
$.extend($.fn.validatebox.defaults.rules, {
    equals: {
        validator: function(value,param){
            return value == $(param[0]).val();
        },
        message: '不匹配！'
    }
});

/**
 * 角色验证
 */
$.extend($.fn.validatebox.defaults.rules, {
    startWith: {
        validator: function(value,param){
            return value.indexOf(param[0])==0;
        },
        message: '角色编码必须以【ROLE_】开始！'
    }
});

//$.fn.datebox.defaults.formatter = function(date){
//
//    var y = date.getFullYear();
//    var m = date.getMonth()+1;
//    var d = date.getDate();
//    date.setti
//    return date.UTC;
//}
//
//

/**
 * 日期格式化
 * @param value
 * @param row
 * @param index
 * @return {*}
 */
function dateFormate(value,row,index){

    if(value==null || value == undefined) return value;
    var date= new Date( parseInt(value));
    var y = date.getFullYear();
    var m = date.getMonth() + 1;
    var d = date.getDate();
    return y + '-' + (m < 10 ? '0' + m : m) + '-' + (d < 10 ? '0' + d : d);
}

/**
 *
 * @param jsons
 * @param fields
 */
function jsonDateFormate(jsons,fields){
    $.each(jsons,function(i,v){
        $.each(fields,function(fi,fv){

            if(v[fv])
                v[fv]=Date.parse(v[fv]).toString();

        });
    });
}

function enJsonDateFormate(jsons,fields){

    $.each(jsons,function(i,v){
        $.each(fields,function(fi,fv){

            if(v[fv])
                v[fv]=dateFormate(v[fv]);

        });
    });
}


/**
 * 对 form里的date 和datetime类型处理，转成长整形
 */
$.fn.dateFormate=function(){

    var a = this.serializeArray();
    var form=this;

    $.each(a, function() {
        var isDateType= $('#'+this.name,form);

        if(this.value){
            if($(isDateType).attr('date')!=undefined){


                var date=new Date(parseInt(this.value));

                var y = date.getFullYear();
                var m = date.getMonth() + 1;
                var d = date.getDate();
                var sdate= y + '-' + (m < 10 ? '0' + m : m) + '-' + (d < 10 ? '0' + d : d);

                isDateType.val(sdate);



            }else  if($(isDateType).attr('datetime')!=undefined){
                var date=new Date(parseInt(this.value));

                var y = date.getFullYear();
                var m = date.getMonth() + 1;
                var d = date.getDate();
                var h = date.getHours();
                var M = date.getMinutes();
                var s = date.getSeconds();
                var sdate= y + '-' + (m < 10 ? '0' + m : m) + '-' + (d < 10 ? '0' + d : d)+' '+(h < 10 ? '0' + h : h)+':'+(M < 10 ? '0' + M : M)+':'+(s < 10 ? '0' + h : h)

                //2012-06-29T08:08:35Z
                isDateType.val(sdate);

            }
        }
    });
}


/**
 * 时间格式
 * @param value
 * @param row
 * @param index
 * @return {*}
 */
function dateTimeFormate(value,row,index){
    if(value==null || value == undefined) return value;
    var date= new Date( parseInt(value));
    var y = date.getFullYear();
    var m = date.getMonth() + 1;
    var d = date.getDate();
    var h = date.getHours();
    var M = date.getMinutes();
    var s = date.getSeconds();
    return y + '-' + (m < 10 ? '0' + m : m) + '-' + (d < 10 ? '0' + d : d)+' '+(h < 10 ? '0' + h : h)+':'+(M < 10 ? '0' + M : M)+':'+(s < 10 ? '0' + h : h)
}
/**
 * 扩展日期格式
 * @param date
 * @return {string}
 */
$.fn.datebox.defaults.formatter = function(date) {
    var y = date.getFullYear();
    var m = date.getMonth() + 1;
    var d = date.getDate();
    return y + '-' + (m < 10 ? '0' + m : m) + '-' + (d < 10 ? '0' + d : d);
}




/**
 * 生成GUID
 * @return {*}
 */
function guidGenerator() {
    var S4 = function() {
        return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
    };
    return (S4()+S4()+S4()+S4()+S4()+S4()+S4()+S4());
}


/**
 * 把array 转成json，根据key 建立索引
 * @param keyField
 * @param data
 * @return {{}}
 */
function arrayToJson(keyField,data){

    var json={};
    $.each(data,function(i,v){
        json[v[keyField]]=v;
    });
    return json;
}
function gridColumenToJson(keyField,data,json){


    $.each(data,function(i,v){
        if($.type(v)=='array'){
            gridColumenToJson(keyField,v,json);
        }else
            json[v[keyField]]=v;
    });

}
//
//
//$.fn.combogrid.defaults.toolbar=
//
//



function openMainTag(node){

    var b=  $('#centerTabs').tabs('exists',node.text);
    if(!b){
        $('#centerTabs').tabs('add',{
            id:'tabs'+node.id,
            title: node.text,
            selected: true,
            closable:true,
            href:node.attributes.url,
            fit:true


        });
    }else{
        $('#centerTabs').tabs('select', node.text);
    }

}

function closeNode(node){

    var b=  $('#centerTabs').tabs('exists',node.text);
    if(!b){

    }else{
        $('#centerTabs').tabs('close', node.text);
    }
}



function openNodeInWindow(node){

    closeNode(node);
    $('<div/>').dialog({
        title:node.text,
        modal:true,
        width:700,
        height:500,
        href:node.attributes.url,
        onClose : function() {
            $(this).dialog('destroy');
        }
    });

}

function clearComboTree(id){

    $('#'+id).combotree("clear");
}

$.extend($.fn.datagrid.defaults.editors, {
    comboxtree: {
        init: function(container, options){

            var input = $('<input type="text" id="'+options.cid+'">').appendTo(container);
           var clear=$('<div  style="background-color: #b7d2ff;text-align: center;"><a href="#" onclick=clearComboTree("'+options.cid+'")>清除</a></div>');
            input.combotree(options);
           clear.appendTo(input.combo('panel'));

            return input;
        },
        destroy:function(target){
           $(target).combotree('destroy');
        },
        getValue: function(target){
            var t = $(target).combotree('tree');	// get the tree object
            var node=  t.tree('getSelected');
            if(node!=null){
                return node.attributes;
            }else{
                var options=    $(target).combotree('options');
                return  options['_value'];
            }

        },
        setValue: function(target, value){
            if(value!=null && value!=undefined){

            var options=    $(target).combotree('options');
            var text=options['textField'];
                options['_value']=value;

                $(target).combotree("setValue",value.name);
            }

        },
        resize: function(target, width){
           $(target).combotree('resize',width);
        }
    }
});


$.extend($.fn.datagrid.defaults.editors, {
    comboxgrid: {
        init: function(container, options){
            var input = $('<input type="text"  id="'+options.cid+'">').appendTo(container);
            return input.combogrid(options);
        },
        destroy:function(target){
            $(target).combogrid('destroy');
        },
        getValue: function(target){
            // var options= $(target).combogrid("options");
            // var textField=options.textField
            return $(target).combogrid("grid").datagrid('getSelected');

        },
        setValue: function(target, value){

            if(value!=null && value!=undefined){

               var grid= $(target).combogrid("grid");
                $(grid).datagrid('appendRow',value);

                $(target).combogrid("setValue",value.id);
                $(grid).datagrid('selectRow',0);
            }

        },
        resize: function(target, width){
            $(target).combogrid('resize',width);
        }
    }
});

$.extend($.fn.datagrid.defaults.editors, {
    label: {
        init: function(container, options){
            var input = $('<input type="text" class="datagrid-editable-input" readonly>').appendTo(container);
            return input;
        },
        getValue: function(target){
            return $(target).val();
        },
        setValue: function(target, value){

            $(target).val(value);

        },
        resize: function(target, width){
            var input = $(target);
            if ($.boxModel == true){
                input.width(width - (input.outerWidth() - input.width())-6);
            } else {
                input.width(width-6);
            }
        }
    }
});
$.extend($.fn.datagrid.defaults.editors, {
    datelabel: {
        init: function(container, options){
            var input = $('<input type="text" class="datagrid-editable-input" readonly>').appendTo(container);
            return input;
        },
        getValue: function(target){
            return Date.parse($(target).val());
        },
        setValue: function(target, value){

            $(target).val(dateFormate(value));
        },
        resize: function(target, width){
            var input = $(target);
            if ($.boxModel == true){
                input.width(width - (input.outerWidth() - input.width())-6);
            } else {
                input.width(width-6);
            }
        }
    }
});

$.extend($.fn.datagrid.defaults.editors, {
    numberlabel: {
        init: function(container, options){
            var input = $('<input type="text"  readonly>').appendTo(container);
            input.numberbox(options);
//            input.numberbox('disable');
            return input;
        },
        getValue: function(target){
            return $(target).numberbox('getValue');
        },
        setValue: function(target, value){

            $(target).numberbox('setValue',value);
        },
        resize: function(target, width){
            var input = $(target);
            if ($.boxModel == true){
                input.width(width - (input.outerWidth() - input.width())-10);
            } else {
                input.width(width-10);
            }

        }
    }
});


//给数据赋值  json 结构
function setObjectAttr(obj,path,value){
    if(path.indexOf('.')<0){//无 .
         obj[path]=value;
        return;
    }
    var fields=path.split('.');

    var valueP=obj;//上一层数据对象
    var valueN;//指向下一层数据对象
    for(var i=0;i<fields.length-1;i++){

         valueN =  getObjectAttr_(valueP,fields[i]);
        if(valueN==null){
            valueP[fields[i]]={};
            valueN=valueP[fields[i]];
        }
        valueP=valueN;//上层数据重新指向下层数据
    }
    valueN[fields[fields.length-1]]=value;
//    alert(JSON.stringify(obj[fields[0]]) );
}

/**
 * 获取json 中的数据
 * @param obj
 * @param path
 * @returns {*}
 */
function getObjectAttr(obj,path){
    if(path.indexOf('.')<0){//无 .
      return getObjectAttr_(obj,path);
    }
    var fields=path.split('.');

    var value=obj;
    for(var i=0;i<fields.length;i++){

        value =  getObjectAttr_(value,fields[i]);

//        alert(fields[i]+':'+value);
    }
    obj[path]=value;
    return value;


}

function getObjectAttr_(obj,field){
    if(obj==null) return null;
    if(obj[field]==undefined) return null;
    return obj[field];
}


function isEmpty(obj){
    if(obj==undefined)
        return true;
    if(obj==null)
        return true;
    if(obj=='') return true;
    if(obj==NaN) return true;

    return false;
}


function onQuery(field,pageId,p_pageId){

    var grid=$('#'+field+pageId).combogrid('grid');

    if($('#fieldkey'+p_pageId).val()!='' && $('#where'+p_pageId).val()!=''){
        var sjson='{operator:and,criterias:[{operator:contains,fieldName:'+$('#fieldkey'+p_pageId).val()+',value:'+$('#where'+p_pageId).val()+'}]}';
        $(grid[0]).datagrid('reload',{queryParams:sjson});
    }else{

        $(grid[0]).datagrid('reload',{queryParams:'{}'});

    }
}
function _onShowPanelInForm(id,pageId,url){



    var tgt=$('#'+id+pageId);
    var options= $(tgt).combogrid('options');
    if(options.loaded==true)
        return;

    var value=  $(tgt).combogrid('getValue')
    var grid=$(tgt).combogrid('grid');

        $(grid).datagrid('options').url=url;



    $(grid).datagrid('reload');
    options.loaded=true;

}

    function _onShowPanel(id,pageId,url){



    var tgt=$('#'+id+pageId);
    var options= $(tgt).combogrid('options');
    if(options.loaded==true)
        return;

    var value=  $(tgt).combogrid('getValue')
    var grid=$(tgt).combogrid('grid');
    if(value!=null && value!=''){

        $(grid).datagrid('options').url=url+'/'+value;
    }else{
        $(grid).datagrid('options').url=url;
    }


    $(grid).datagrid('reload');
    options.loaded=true;




//   var options= $('#'+id+pageId).combogrid('options');
//    var target= $('#'+id+pageId);
//    $(target).combo('panel').find('div.combobox-item').show();
//
//    options.onShowPanel.call(target);
//   if(options.loaded==true) return;
//
//
//    var grid=$(target).combogrid('grid');
//
//
//        var value=$(target).combobox('getValue');
//        if(value!=null && value!=''){
//
//            $(grid).datagrid('options').url=url+'/'+value;
//        }else{
//
//            $(grid).datagrid('options').url=url;
//        }
//
//
//    $(grid).datagrid('reload');
//    options.loaded=true;


}


function _onHeaderContextMenu(e, field,id,pageId,p_pageId){

    e.preventDefault();

    $('#fieldkey'+p_pageId).val(field);

    var options=$('#'+id+pageId).combogrid('options');
    var json={};

    gridColumenToJson('field',options.columns,json);

    $('#fieldname'+p_pageId).val(json[field].title);
}